/**
 * SPDX-FileCopyrightText: 2023-2025 Sangfor Technologies Inc.
 * SPDX-License-Identifier: Mulan PSL v2
 */
/**
 * Created by oj on 2018/3/8.
 */
import { deepCompare } from 'src/util/deep_compare';

import * as TYPES from '../mutation_types';
import {deepClone} from 'src/util/deep_clone';

const SERVERS_COUNT_LIMIT = 3;

let defaultState = {
    clusterID: -1,      // 当前操作的集群 Id，从进入时 Url 的 query 中获取

    serverList: [],     // 储存的服务器列表，用于判断服务器数量变化，是否需要重新配置

    tplConfig: {},      // 储存的模板配置信息，用于缓存模板配置的信息

    serviceList: [],    // 储存的服务配置信息，用于储存服务配置的数据，判断是否发生变化

    lastModified: null  // 整体流程中，最后修改发生的时间，和当前页面的修改时间对比，判断是否需要更新
};

let getters = {
    isChanged: (state) => (date) => {
        if (date) {
            return date < state.lastModified;
        }
        return false;
    },
    getClusterID: (state) => () => {
        return state.clusterID > 0 ? state.clusterID : false;
    }
};

let mutations = {
    [TYPES.SET_CUR_CLUSTER_ID] (state, id) {
        state.clusterID = id;
    },

    // 更新服务列表里某个服务项的数据
    // payload格式形如:
    //     {
    //         id: 1,
    //         serverNodes: [
    //             { id: 1 }
    //         ]
    //     }
    [TYPES.UPDATE_SERVICE_ITEM] (state, payload) {
        let list = state.serviceList;
        let index = list.findIndex(item => item.id === payload.id);
        if (index > -1) {
            list.splice(index, 1, payload);
        }
    },

    [TYPES.SET_SERVER_LIST] (state, list) {
        state.serverList = list;
    },

    // list的每项是一个对象, 格式形如:
    //     {
    //         id: 1,
    //         serverNodes: [
    //             { id: 1 }
    //         ]
    //     }
    [TYPES.SET_SERVICE_LIST] (state, list) {
        state.serviceList = list;
    },

    [TYPES.SET_TPL_CONFIG] (state, tplConfig) {
        state.tplConfig = tplConfig;
    },

    [TYPES.UPDATE_LAST_MODIFIED] (state) {

        // 数据发生更新
        state.lastModified = new Date().getTime();
    },

    [TYPES.RESET] (state) {
        Object.keys(defaultState).forEach(key => {
            state[key] = deepClone(defaultState[key]);
        });
    }
};

let actions = {
    setServerList ({ commit, state }, list) {
        return new Promise((resolve, reject) => {
            if (list.length < SERVERS_COUNT_LIMIT) {
                return reject(_(`至少需要配置 3 台服务器，当前只配置了 {0} 台`, list.length));
            }

            // 判断是否存在变化
            if (state.serverList && list
                .map(item => item.id)
                .sort().join(',') !== state.serverList
                .map(item => item.id)
                .sort().join(',')) {

                // 更新时间戳
                commit(TYPES.UPDATE_LAST_MODIFIED);

                // 写入 list
                commit(TYPES.SET_SERVER_LIST, list);
            }
            return resolve();
        });
    },

    setTplConfig ({ commit, state }, tplConfig) {
        return new Promise((resolve) => {

            // 判断是否存在变化

            if (!deepCompare(state.tplConfig, tplConfig)) {

                // 更新时间戳
                commit(TYPES.UPDATE_LAST_MODIFIED);

                // 写入 list
                commit(TYPES.SET_TPL_CONFIG, tplConfig);
            }
            return resolve();
        });
    }
};

export default {
    state: deepClone(defaultState),
    getters,
    mutations,
    actions
};
